RANSAC(RANdom SAmple Consensus)
선형 회귀 모델은 이상치(outlier)에 크게 영향을 받는다.(데이터의 일부분이 큰 영향을 끼칠 수 있다.)
RANSAC는 이상치를 제거하는 대신 안정된 회귀 모델을 만든다.
RANSAC는 정상치(inlier)라는 일부 데이터를 이용해서 회귀 모델을 훈련한다.
Process of RANSAC
1. 랜덤하게 일부 샘플을 정상치로 선택하여 모델을 훈련한다.
2. 훈련된 모델에서 다른 모든 포인트를 테스트한다. 사용자가 입력한 허용 오차 안에 속한 포인트를 정상치에 추가
3. 모든 정상치를 사용하여, 모델을 다시 훈련한다.
4. 훈련된 모델과 정상치 간의 오차를 계산
5. 성능이 사용자가 지정한 임계 값에 도달하거나, 지정된 반복 횟수에 도달하면 알고리즘을 종료
그렇지 않으면 1번부터 반복
from sklearn.linear_model import RANSACRegressor
from sklearn.linear_model import LinearRegression
ransac=RANSACRegressor(LinearRegression(), max_trials=100, min_samples=50, loss='absolute_loss', residual_threshold=5.0, random_state=0)
ransac.fit(X,y)
최대 반복 횟수는 100회 최소 샘플의 개수를 50개로 지정(default값 max_trials=100, min_samples=특성 개수+1)
loss 매개변수를 absolute_loss로 수직 거리의 절댓값으로 하고,
residual_threshold=5.0으로 직선과 수직거리가 5 이내에 있는 샘플만 정상 샘플로 포함시킨다.
residual_threshold=None일 때, 타깃 값 y의 중앙값 절대 편차(Median Absolute Deviation, MED)를 이용한다.
적절한 정상치 임계값은 문제에 따라 다르다.
import matplotlib.pyplot as plt
import numpy as np
inlier_mask=ransac.inlier_mask_
outlier_mask=np.logical_not(inlier_mask)
line_X=np.arange(3, 10, 1)
line_y_ransac=ransac.predict(line_X[:, np.newaxis])
plt.scatter(X[inlier_mask], y[inlier_mask], c='steelblue', edgecolor='white', marker='o', label='Inliers')
plt.scatter(X[outlier_mask], y[outlier_mask], c='limegreen', edgecolor='white', marker='s', label='Outliers')
plt.plot(line_X, line_y_ransac, color='black', lw=2)
plt.xlabel('Average number of rooms [RM]')
plt.ylabel('Price in $1000s [MEDV]')
plt.legend(loc='upper left')
plt.show()
print('기울기: %.3f' %ransac.estimator_.coef_[0])
print('절편: %.3f' %ransac.estimator_.intercept_)
RANSAC을 이용하면 데이터셋에 있는 이상치의 잠재적인 영향을 감소시킨다.
하지만 위 방법은 알지 못하는 데이터셋(학습하지 않은)에 대한 예측 성능에 긍정적인 영향을 미치는지 미치지 못하는지 알 수 없다.